#ifndef _RENDER_OGL_H_
#define _RENDER_OGL_H_

#include "render.h"
#include <windows.h>
#include <gl/gl.h>

#ifdef _DEBUG
//#TODO
#define OGLCHECK(x) {if(0){if(dbg_assert_msg(#x,"OpenGL assert")!=IDCANCEL)_asm{int 3};}}
#else
#define OGLCHECK(x) {}
#endif

class render_ogl: public render
{
public:
	render_ogl();
	~render_ogl();

	void init(xml_node& _node);
	void reset();
	void free();
	device_state get_state();

	void begin();
	void end();
	void clear(u32 _type,color _color,float _z,u32 _stencil);

	vbuffer* create_vbuffer(buffer_usage _usage,u32 _vformat,u32 _blocksize,u32 _lenth);
	ibuffer* create_ibuffer(buffer_usage _usage,u32 _size);
	void	 set_vbuffer(vbuffer* _vbuffer);
	void	 set_ibuffer(ibuffer* _ibuffer);
	void	 draw_vbuffer(primitiv_type _prtype,u32 _start_vrt,u32 _pr_count);
	void	 draw_ibuffer(primitiv_type _prtype,u32 _num_vtx,u32 _start_idx,u32 _pr_count);
	texture* create_texture(u32 _w, u32 _h,tex_format _fmt);
	void	 set_texture(u32 _stage,texture* _texture);
	effect*  create_effect(file* _file,const char* _vfunc,const char* _pfunc);
	effect*  create_effect(const char* _fname,const char* _vfunc,const char* _pfunc);
	void	 set_effect(effect* _effect);

	void enable_light(bool _enabled);
	void set_light(u32 _stage,light _light);
	void set_material(material _material);
	void set_ambient(color _color);
	void set_cullmode(cull_mode _mode);
	void set_fillmode(fill_mode _mode);

	void set_projection(matrix4 _matrix);
	void set_view(matrix4 _matrix);
	void set_world(matrix4 _matrix);
	void set_viewport(u32 _x,u32 _y,u32 _width,u32 _height);

private:

	HGLRC m_rc;
	HDC   m_dc;
};

#endif